#pragma once

#include <string>
#include <opencv2/opencv.hpp>
#include <nlohmann/json.hpp>
#include <memory>

using json = nlohmann::json;

struct ServerResponse {
    bool success;
    std::string message;
    json data;
};

struct FrameResponse {
    bool success;
    cv::Mat frame;
    double timestamp;
};

struct ServerStatus {
    bool is_streaming;
    bool camera_opened;
    double fps;
    int frame_count;
};

class NetworkClient {
public:
    NetworkClient(const std::string& base_url);
    ~NetworkClient() = default;

    // 基本网络操作
    ServerResponse get(const std::string& endpoint);
    ServerResponse post(const std::string& endpoint, const json& data);
    
    // 视频流相关
    bool start_video_stream();
    bool stop_video_stream();
    FrameResponse get_current_frame();
    ServerStatus get_server_status();
    
    // 工具函数
    std::string get_base_url() const { return base_url_; }
    bool is_connected();

private:
    std::string base_url_;
    int timeout_ms_;
    
    // 内部工具函数
    cv::Mat decode_base64_image(const std::string& base64_data);
    std::string encode_base64_image(const cv::Mat& image);
    std::string make_request(const std::string& method, const std::string& endpoint, const json& data = json{});
}; 